Segment Tree [백준 11505 - Kotlin] 구간 곱 구하기 Segment TreekotlinSegment Tree 백준 3006번: 터보소트 이전 버블소트 문제에서 쿼리 날리는 순서를 바꾸기만 하면 풀 수 있다. 0 ~ i이랑 N-1-i ~ N-1 번갈아서 날려주면 1, N, 2, N-1 순서로 정렬 가능. 터보소트 (느림)... Segment TreepscppSegment Tree 백준 2243번: 사탕상자 각 구간에서의 사탕 개수 합을 저장한다. rank번째로 맛있는 사탕을 사탕을 구할때는 세그먼트 트리에서 binary search를 하면 된다! 루트부터 시작해서, left node에 저장된 합이 rank보다 크거나 같은 경우는 왼쪽으로, rank가 더 큰 경우는 오른쪽으로 가면 된다. 이때 다음 서브트리에서도 똑같은 규칙을 적용하기 위해 rank에서 left node에 저장된 합만큼 빼준다.... Segment TreepsBinary SearchcppBinary Search 백준 10999번: 구간 합 구하기 2 구간의 길이가 최대 N이므로 구간에 존재하는 모든 노드를 바꾸려면 NlogN이 걸린다. 해당 구간에 존재하는 모든 노드를 업데이트하지 말고, 이 노드는 업데이트가 필요합니다! 라고 표시만 해놓고 나중에 방문할 때 업데이트를 해주면 어떨까? 딱 맞는 구간까지만 업데이트하고, 그 구간을 표시하는 노드의 left, right child에 표시를 해둔다. 나중에 그 child를 방문했을 때, 값을 ... lazy propagationSegment TreepscppSegment Tree 백준 3653번: 영화 수집 쿼리가 최대 10만개 주어진다. 배열을 0~99,999, 100,000~199,999 두 구간으로 나누고, DVD를 가장 위로 올릴 때 10만부터 시작해서 하나씩 순서대로 올리면서 합을 구하면 풀 수 있다. DVD 번호가 주어졌을 때 배열의 어디에 위치하는지 바로 알 수 있게 인덱스를 저장한다. 쿼리 개수가 제한적일 때 유용한 테크닉인 것 같다. 지식이 늘었다.... Segment TreepscppSegment Tree 백준 2042번: 구간 합 구하기 세그먼트 트리 연습 문제다. 루트에는 전부 합한 값이, 그 자식은 구간을 반씩 잘라서 그 구간에 해당하는 값을 가지고 있다. 왼쪽 자식은 부모 인덱스 * 2, 오른쪽 자식은 부모 인덱스 * 2 + 1이다. (루트는 1부터) 어떤 구간의 합이라도 O(logN)으로 구할 수 있다. 루트부터 필요한 구간이 나올 때까지 왼쪽, 오른쪽 재귀호출한다. 또 이렇게 합을 저장해놓으면 중간에 값의 변경이 일... Segment TreepscppSegment Tree 백준 12844번: XOR XOR 연산은 결합법칙과 교환법칙이 성립한다. 따라서 구간합 세그먼트 트리처럼 구성할 수 있다. lazy[node*2] ^= lazy[node] 해야하는데 +=을 써버렸다. 상위 노드만 연속으로 방문해서 자식 노드에 업데이트 해야하는 내용이 쌓일 수 있기 때문에 항상 0이라는 보장을 할 수 없다. 주의하도록 하자..!... lazy propagationSegment TreepscppSegment Tree 백준 1280번: 나무 심기 해당 구간에 존재하는 나무의 개수와 인덱스 0부터 각 나무까지 거리의 합을 세그먼트 트리에 기록한다. 이렇게 하면 새로운 나무를 심을 때 바로 cost를 구할 수 있다. 리프 노드에는 {인덱스 번호 * 나무 개수, 나무 개수}가 기록되어 있다. 새로 심는 나무의 인덱스 i를 기준으로 왼쪽은 left cnt * i - left sum, 오른쪽은 right sum - right cnt * i가 ... Segment TreepscppSegment Tree 알고리즘 스터디 - 3주차 알고리즘 스터디 내용 및 회고 주제 Segment Tree(lazy propagation) 백준 10999번(lazy propagation을 이용한 문제) Segment Tree(lazy propagation) Segment Tree에서 구간 업데이트를 빠르게 하기 위해 적용한 lazy propagation에 대해 공부하였음. 컴퓨터구조에서 배운 캐시의 개념과 비슷하게 생각하였음. 참고 : ... Segment Treelazy propagationSegment Tree
[백준 11505 - Kotlin] 구간 곱 구하기 Segment TreekotlinSegment Tree 백준 3006번: 터보소트 이전 버블소트 문제에서 쿼리 날리는 순서를 바꾸기만 하면 풀 수 있다. 0 ~ i이랑 N-1-i ~ N-1 번갈아서 날려주면 1, N, 2, N-1 순서로 정렬 가능. 터보소트 (느림)... Segment TreepscppSegment Tree 백준 2243번: 사탕상자 각 구간에서의 사탕 개수 합을 저장한다. rank번째로 맛있는 사탕을 사탕을 구할때는 세그먼트 트리에서 binary search를 하면 된다! 루트부터 시작해서, left node에 저장된 합이 rank보다 크거나 같은 경우는 왼쪽으로, rank가 더 큰 경우는 오른쪽으로 가면 된다. 이때 다음 서브트리에서도 똑같은 규칙을 적용하기 위해 rank에서 left node에 저장된 합만큼 빼준다.... Segment TreepsBinary SearchcppBinary Search 백준 10999번: 구간 합 구하기 2 구간의 길이가 최대 N이므로 구간에 존재하는 모든 노드를 바꾸려면 NlogN이 걸린다. 해당 구간에 존재하는 모든 노드를 업데이트하지 말고, 이 노드는 업데이트가 필요합니다! 라고 표시만 해놓고 나중에 방문할 때 업데이트를 해주면 어떨까? 딱 맞는 구간까지만 업데이트하고, 그 구간을 표시하는 노드의 left, right child에 표시를 해둔다. 나중에 그 child를 방문했을 때, 값을 ... lazy propagationSegment TreepscppSegment Tree 백준 3653번: 영화 수집 쿼리가 최대 10만개 주어진다. 배열을 0~99,999, 100,000~199,999 두 구간으로 나누고, DVD를 가장 위로 올릴 때 10만부터 시작해서 하나씩 순서대로 올리면서 합을 구하면 풀 수 있다. DVD 번호가 주어졌을 때 배열의 어디에 위치하는지 바로 알 수 있게 인덱스를 저장한다. 쿼리 개수가 제한적일 때 유용한 테크닉인 것 같다. 지식이 늘었다.... Segment TreepscppSegment Tree 백준 2042번: 구간 합 구하기 세그먼트 트리 연습 문제다. 루트에는 전부 합한 값이, 그 자식은 구간을 반씩 잘라서 그 구간에 해당하는 값을 가지고 있다. 왼쪽 자식은 부모 인덱스 * 2, 오른쪽 자식은 부모 인덱스 * 2 + 1이다. (루트는 1부터) 어떤 구간의 합이라도 O(logN)으로 구할 수 있다. 루트부터 필요한 구간이 나올 때까지 왼쪽, 오른쪽 재귀호출한다. 또 이렇게 합을 저장해놓으면 중간에 값의 변경이 일... Segment TreepscppSegment Tree 백준 12844번: XOR XOR 연산은 결합법칙과 교환법칙이 성립한다. 따라서 구간합 세그먼트 트리처럼 구성할 수 있다. lazy[node*2] ^= lazy[node] 해야하는데 +=을 써버렸다. 상위 노드만 연속으로 방문해서 자식 노드에 업데이트 해야하는 내용이 쌓일 수 있기 때문에 항상 0이라는 보장을 할 수 없다. 주의하도록 하자..!... lazy propagationSegment TreepscppSegment Tree 백준 1280번: 나무 심기 해당 구간에 존재하는 나무의 개수와 인덱스 0부터 각 나무까지 거리의 합을 세그먼트 트리에 기록한다. 이렇게 하면 새로운 나무를 심을 때 바로 cost를 구할 수 있다. 리프 노드에는 {인덱스 번호 * 나무 개수, 나무 개수}가 기록되어 있다. 새로 심는 나무의 인덱스 i를 기준으로 왼쪽은 left cnt * i - left sum, 오른쪽은 right sum - right cnt * i가 ... Segment TreepscppSegment Tree 알고리즘 스터디 - 3주차 알고리즘 스터디 내용 및 회고 주제 Segment Tree(lazy propagation) 백준 10999번(lazy propagation을 이용한 문제) Segment Tree(lazy propagation) Segment Tree에서 구간 업데이트를 빠르게 하기 위해 적용한 lazy propagation에 대해 공부하였음. 컴퓨터구조에서 배운 캐시의 개념과 비슷하게 생각하였음. 참고 : ... Segment Treelazy propagationSegment Tree